package com.rd.student.ruanjian.class3.gaochenxi.NumberThree;

import java.util.Scanner;

public class NumberThree {

      public static void main(String[] args) {
            System.out.println("请输入想要形成的层数：");
            Scanner scanner=new Scanner(System.in);
            int num=scanner.nextInt();
            int[][] func = Func(num);
            for(int i=0;i<num;i++){
                  for(int j=0;j<num;j++){
                        System.out.print(func[i][j]+"   ");
                  }
                  System.out.println();
            }
      }

      public static int[][] Func(int num){
            /*
                  这道题我采用左闭右开的方式处理，拿num=4举例，例如第一圈:0,1,2(终止)[0,3)
                  第二圈:3,4,5(终止)[3,6)..像这样，如果是奇数圈的话，我直接给中间的那个数赋值为count;
             */
            int offset = 0;  // 控制循环次数(每行每列等到最后一个节点的时候，我不处理，等到换个方向时再处理这个offest，
                                    // 他作为终止节点的的判定条件，往里一圈，offset=offset+1;)

            int[][] res = new int[num][num];//创建一个二维数组
            int start = 0;  // 每次循环的开始点(start, start)
            int count = 1;  // 定义填充数字
            int i, j;//i为横坐标，j为纵坐标

            while (offset++ < num / 2) { // 判断边界后，offset从1开始
                  // 模拟上侧从左到右
                  for (j = start; j <num - offset; j++) {
                        res[start][j] = count++;
                  }

                  // 模拟右侧从上到下
                  for (i = start; i < num - offset; i++) {
                        res[i][j] = count++;
                  }

                  // 模拟下侧从右到左
                  for (; j >= offset; j--) {
                        res[i][j] = count++;
                  }

                  // 模拟左侧从下到上
                  for (; i >= offset; i--) {
                        res[i][j] = count++;
                  }
                  start++;
            }

            if (num % 2 == 1) {
                  res[start][start] = count;
            }

            return res;
      }
}
